﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using AdmLaboratorios;
using AdmLaboratorios.Business;
using AdmLaboratorios.Business.Entities;

namespace AdmLaboratorios
{
    public partial class frmUsuarios : Form
    {
        //private UsuarioDTO usu;
        private int idUsuario = -1;

        public frmUsuarios()
        {
            InitializeComponent();
        }

        private void frmUsuarios_Load(object sender, EventArgs e)
        {
            try
            {
                
                dg.CellPainting += new DataGridViewCellPaintingEventHandler(gv_CellPainting);
                dg.CellClick += new DataGridViewCellEventHandler(gv_CellClick);

                //FormsHelper.CargarCombo(ref cmbPerfil, Perfiles.CargarCombo(false));

                LimpiarControles();

                //dg.DataSource = null;
                dg.DataSource = Seguridad.UsuariosPerfiles(); // Usuarios.Listado("");
            }
            catch (Exception ex)
            {
                FormsHelper.MsgErrorInesperado(ex);
            }
        }


        void gv_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
        {
            DataGridView gv = (DataGridView)sender;
            FormsHelper.PintarBotones(e, gv, ilBotones);
        }

        void gv_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            DataGridView gv = (DataGridView)sender;
            int colIndex = e.ColumnIndex;
            int rowIndex = e.RowIndex;

            if (colIndex == -1 || rowIndex == -1) return;

            if (gv.Columns[colIndex] is DataGridViewButtonColumn)
            {
                if (gv.Columns[colIndex].Name == "cEdit")
                {
                    using (frmUsuarioPerfilDialog f = new frmUsuarioPerfilDialog())
                    {
                        FormsHelper.CargarColumnasGrilla(f);
                        f.SetUser((UsuarioPerfiles)gv.Rows[rowIndex].DataBoundItem);
                        if (f.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                        {
                            Seguridad.AsignarPerfiles(((UsuarioPerfiles)gv.Rows[rowIndex].DataBoundItem).Id, f.GetPerfilesSeleccionados());
                            dg.DataSource = Seguridad.UsuariosPerfiles();
                        }                        
                    }
                }
                //else if (gv.Columns[colIndex].Name == "cDelete")
                //{
                //    if (gv.Rows[rowIndex].DataBoundItem is PerfilDTO)
                //    {
                //        if (MessageBox.Show(
                //            "¿Está seguro de que desea eliminar el perfil seleccionado?",
                //            "Eliminar Perfil", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.Yes)
                //        {
                //            Seguridad.DeletePerfil(((PerfilDTO)gv.Rows[rowIndex].DataBoundItem).Id);

                //            dg.DataSource = Seguridad.UsuariosPerfiles();
                //        }
                //    }
                //}
            }
        }

        private void btnNuevo_Click(object sender, EventArgs e)
        {
            LimpiarControles();

            pan.Enabled = false;
            grp.Enabled = true;

            idUsuario = -1;

            txUsuario.Enabled = true;
            txUsuario.Focus();
        }

        private void LimpiarControles()
        {
            txUsuario.Clear();
            txContraseña.Clear();
        }

        private bool Validar()
        {
            if (txUsuario.Text.Trim() == "")
            {
                errP.SetError(txUsuario, "Debe ingresar un nombre!");
                return false;
            }

            if (idUsuario == -1 && Seguridad.ExisteUsuario(txUsuario.Text.Trim())) //Usuarios.existeNombre(txUsuario.Text.Trim()))
            {
                errP.SetError(txUsuario, "El nombre de usuario ya existe!");
                return false;
            }

            if (txContraseña.Text.Trim() == "")
            {
                errP.SetError(txContraseña, "Debe ingresar una contraseña!");
                return false;
            }

            //if (cmbPerfil.SelectedIndex == -1)
            //{
            //    errP.SetError(cmbPerfil, "Debe seleccionar un perfil!");
            //    return false;
            //}

            return true;
        }

        private void btnGuardar_Click(object sender, EventArgs e)
        {
            try
            {
                //Limpio todos los errores.
                errP.Clear();

                //Si pasaron todas las validaciones, grabo.
                if (Validar())
                {

                    if (idUsuario == -1) //Alta.
                        Seguridad.AltaDeUsuario(txUsuario.Text,
                            txContraseña.Text);

                    else //Modificacion.
                        Seguridad.ModificacionDeUsuario(idUsuario,
                            txUsuario.Text,
                            txContraseña.Text);


                    grp.Enabled = false;
                    pan.Enabled = true;

                    LimpiarControles();

                    //dg.DataSource = null; Si le hago el Null, pierdo las columnas.
                    dg.DataSource = Seguridad.UsuariosPerfiles();// Usuarios.Listado("");
                }
            }
            catch (Exception ex)
            {
                FormsHelper.MsgErrorInesperado(ex);
            }
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            grp.Enabled = false;
            pan.Enabled = true;

            LimpiarControles();
        }

        private void btnModificar_Click(object sender, EventArgs e)
        {
            try
            {
                //Si no hay nada seleccionado, salgo.
                if (dg.SelectedRows.Count < 1) return;

                idUsuario = (int)dg.SelectedRows[0].Cells["cId"].Value;
                txUsuario.Text = dg.SelectedRows[0].Cells["cUsuario"].Value.ToString();
                txContraseña.Text = dg.SelectedRows[0].Cells["cPass"].Value.ToString();
                //cmbPerfil.SelectedIndex = cmbPerfil.FindStringExact(dg.SelectedRows[0].Cells["cPerfil"].Value.ToString());

                txUsuario.Enabled = false;

                grp.Enabled = true;
                pan.Enabled = false;
            }
            catch (Exception ex)
            {
                FormsHelper.MsgErrorInesperado(ex);
            }
        }

        private void btnEliminar_Click(object sender, EventArgs e)
        {
            try
            {
                //Si no hay nada seleccionado, salgo.
                if (dg.SelectedRows.Count < 1) return;

                //Valido que no borren a ADMIN.
                if (dg.SelectedRows[0].Cells["cUsuario"].Value.ToString().ToUpper() == "ADMIN")
                {
                    MessageBox.Show("No puede eliminar al usuario 'ADMIN', ya que es el Administrador del Sistema, y podría perder acceso a todas las funcionalidades del mismo.\n\nSi lo desea, puede modificar su contraseña.", "Imposible Eliminar Usuario", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    return;
                }

                //Pido confirmacion del usuario.
                if (MessageBox.Show("¿Está seguro de que desea eliminar el usuario seleccionado?", "Eliminar Usuario", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                {
                    Seguridad.BajaDeUsuario((int)dg.SelectedRows[0].Cells["cId"].Value);
                    dg.DataSource = Seguridad.UsuariosPerfiles(); // Usuarios.Listado("");
                }
            }
            catch (Exception ex)
            {
                FormsHelper.MsgErrorInesperado(ex);
            }
        }

        private void btnCerrar_Click(object sender, EventArgs e)
        {
            this.Close();
        }
    }
}
